home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Floppyshop 2
/
Floppyshop - 2.zip
/
Floppyshop - 2.iso
/
art&graf.ix
/
art-6205
/
morphing
/
util
/
g_sprl.lst
next >
Wrap
File List
|
1996-11-16
|
3KB
|
136 lines
' **************************************
' ** Calcul de grille déformé
' ** Grille circulaire et sprirale
' ** GFA Basic
' **
' ** Valvassori Moïse 14.10.96
' **************************************
'
w=319 ! taille de la grille
h=199
c=20 ! nombre de ligne marge comprise
l=20
nom_grille$="GRILLE.GRD"
DIM gx%(c,l),gy%(c,l) ! grille d'arrivé
DIM gx1%(c,l),gy1%(c,l) ! grille de départ
init
trace
calcul
verif
trace
sauve
PROCEDURE calcul1
' Une première méthode de calcul
LOCAL x,y
FOR x=0 TO c-1
FOR y=0 TO l-1
IF x<>0 AND x<>c-1 ! on déforme pas les bords
gx%(x,y)=gx%(x,y)+50*(COS(y*(1*PI)/l-1)*SIN(x*(2.5*PI)/(c-1)))
ENDIF
IF y<>0 AND y<>l-1 ! on déforme pas les bords
gy%(x,y)=gy%(x,y)+50*(COS(x*(3*PI)/(c-1))*SIN(y*PI/(l-1)))
ENDIF
NEXT y
NEXT x
RETURN
PROCEDURE calcul
LOCAL k,y,x,d,cos,sin,pi180,a,an
k=1*360
pi180=180/PI
FOR y=0 TO l-1
FOR x=0 TO c-1
d=SQR(((w/2)-gx%(x,y))^2+((h/2)-gy%(x,y))^2)
IF d<>0
cos=(gx%(x,y)-(w/2))/d
sin=(gy%(x,y)-(h/2))/d
IF sin>0
an=ACOS(cos)*pi180
ELSE
an=-ACOS(cos)*pi180
ENDIF
a=an-(1-(d/(100)))*k
' a=an+(SINQ(d/l*360))*k
' a=an+RND*((d/l)*k)-k/2
ELSE
a=0
ENDIF
gx%(x,y)=(w/2)+d*COSQ(a)
gy%(x,y)=(h/2)+d*SINQ(a)
NEXT x
NEXT y
RETURN
> PROCEDURE init
LOCAL r,t
FOR t=0 TO c-1
FOR r=0 TO l-1
gx%(t,r)=w/2+((h/2)/(l-1)*r)*COSQ(360/(c-1)*t)
gy%(t,r)=h/2+((h/2)/(l-1)*r)*SINQ(360/(c-1)*t)
gx1%(t,r)=gx%(t,r)
gy1%(t,r)=gy%(t,r)
NEXT r
NEXT t
RETURN
> PROCEDURE trace
' trace que la grille d'arrivé
LOCAL x,y
CLS
FOR x=0 TO c-1
FOR y=0 TO l-1
IF x<>c-1
COLOR (y MOD 15)+1
DRAW gx%(x,y),gy%(x,y) TO gx%(x+1,y),gy%(x+1,y)
ENDIF
IF y<>l-1
COLOR (x MOD 15)+1
DRAW gx%(x,y),gy%(x,y) TO gx%(x,y+1),gy%(x,y+1)
ENDIF
NEXT y
NEXT x
RETURN
> PROCEDURE verif
' Vérifie si l'on est pas sortie du cadre
LOCAL x,y
FOR x=0 TO c-1
FOR y=0 TO l-1
IF gx%(x,y)<1 ! gère le bug du bord gauche de la grille
gx%(x,y)=1
ENDIF
IF gy%(x,y)<0
gy%(x,y)=0
ENDIF
IF gx%(x,y)>w+1 ! bug du bors gauche
gx%(x,y)=w+1
ENDIF
IF gy%(x,y)>h
gy%(x,y)=h
ENDIF
NEXT y
NEXT x
RETURN
> PROCEDURE sauve
LOCAL x,y
OPEN "o",#1,nom_grille$ ! nom du fichier
' header
PRINT #1;"MORPHING GRID";CHR$(0); ! type de fichier
PRINT #1;MKI$(&H100); ! version 1.00
' GRILLE grid 0
PRINT #1;MKI$(c-1);MKI$(l-1);MKI$(gx1%(0,0));MKI$(gy1%(0,0)); ! nb de colone,nb de ligne, coin haut et gauche
PRINT #1;MKI$(gx1%(c-1,l-1));MKI$(gy1%(c-1,l-1));"dumy"; ! coin bas et droit, pointeur sur la grille (dummy)
' GRILLE grid 1
PRINT #1;MKI$(c-1);MKI$(l-1);MKI$(gx%(0,0));MKI$(gy%(0,0));
PRINT #1;MKI$(gx%(c-1,l-1));MKI$(gy%(c-1,l-1));"dumy";
' data grid 0
FOR y=0 TO l-1
FOR x=0 TO c-1
PRINT #1;MKI$(gx1%(x,y));MKI$(gy1%(x,y)); ! les données de la grille
NEXT x
NEXT y
' data grid 1
FOR y=0 TO l-1
FOR x=0 TO c-1
PRINT #1;MKI$(gx%(x,y));MKI$(gy%(x,y));
NEXT x
NEXT y
CLOSE #1
RETURN